/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Bean;

import Controller.ClienteDAO;
import Controller.ProdutoDAO;
import Controller.VendaDAO;
import Model.Cliente;
import Model.Produto;
import Model.Venda;
import java.awt.event.ActionEvent;
import java.sql.Date;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;

/**
 *
 * @author iron
 */
@ManagedBean(name="venda")
@SessionScoped
public class VendaMBean {
    ArrayList<Venda> carrinho;
    ArrayList<Produto> produtosFiltrados;
    static ArrayList<Produto> listaProdutos;
    ArrayList<Produto> produtosEscolhidos;
    
    SelectItem tipos[] = {new SelectItem("","Todos"), new SelectItem("Medicamento"),new SelectItem("Cosmético")};
    
    
    private Produto produtoEscolhido;
    private Cliente comprador;
    private Long cpfComprador;
    private Integer quantidadeEscolhido;    
    private Venda vendaEscolhidoRemover;       
    private double valorTotal;
    private Boolean receita;
    private Integer desconto;
    private Boolean receitaApresentada;
    private String nomeMedico;
    private Integer crmMedico;
    private String receitaMedica;
    
    public VendaMBean() {        
       
        produtosEscolhidos = new ArrayList<Produto>();
        carrinho = new ArrayList<Venda>();
        produtoEscolhido = new Produto();
        vendaEscolhidoRemover = new Venda();
        quantidadeEscolhido = 1;   
        receita = false;
        receitaApresentada = false;
        desconto = 0;
        listaMedicamentos();
        valorTotal = 0.0;
    }
    
    private void initVars() {
        carrinho.clear();
        produtoEscolhido = null;
        produtosEscolhidos.clear();
        valorTotal = 0.0;
        comprador = null;
        receita = false;
        desconto = 0;
        receitaApresentada = false;
        crmMedico = null;
        nomeMedico = null;
        cpfComprador = null;
    }
    
       
    public static ArrayList<Produto> listaMedicamentos(){
       try{
            listaProdutos = ProdutoDAO.INSTANCE.getListaProdutos();
           }catch(Exception ex){
            ex.printStackTrace();
        }        
       return listaProdutos;
    }
    
    public void adicionaProduto(ActionEvent event){
        if(produtoEscolhido == null || produtoEscolhido.getId() == null){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Escolha um Produto para adicionar."));
            return;
        }
        if(quantidadeEscolhido < 1){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Escolha uma quantia válida para os produtos."));
                    return;
        }
        Venda venda = null;
        
        for(Venda v : carrinho){
            if(v.getProduto().getId() == produtoEscolhido.getId()){
                v.setQuantidade(v.getQuantidade()+quantidadeEscolhido);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Produto \""+produtoEscolhido.getNome()+"\" Adicionado"));
                produtoEscolhido = new Produto();
                return;
            }
        }
        
        try {
            venda = new Venda(null, produtoEscolhido, quantidadeEscolhido, nomeMedico, crmMedico, receitaMedica, new Date(new java.util.Date().getTime()),desconto);
        } catch (Exception ex) {
            Logger.getLogger(VendaMBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        produtosEscolhidos.add(produtoEscolhido);
        carrinho.add(venda);
        
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Produto \""+venda.getProduto().getNome()+"\" Adicionado"));
        produtoEscolhido = new Produto();
       
    }
    
    
    public void removeProduto(ActionEvent event){
        if(vendaEscolhidoRemover == null){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Escolha um Produto para remover."));
            return;
        }
        
        for(Venda v : carrinho){
            if(v.equals(vendaEscolhidoRemover)){
               carrinho.remove(v);
            }
        }
        
        
        System.out.println();
        System.out.println();
        System.out.println();
        for(Venda v : carrinho){
            System.out.println(v.getProduto().getNome());
        }
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Produto \""+vendaEscolhidoRemover.getProduto().getNome()+"\" Removido"));
        vendaEscolhidoRemover = new Venda();
    }
    
    public void buscarCliente(ActionEvent event){
        if(cpfComprador == null || cpfComprador == 0){
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Insira o CPF do Cliente para buscar"));
                    return;
        }
        try{
            comprador = ClienteDAO.INSTANCE.findByCPF(cpfComprador);
        }catch(Exception ex){
            ex.printStackTrace();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Falhou!"));
            return;
        }
    }
    
    public void validaVenda(ActionEvent event){
        RequestContext rc = RequestContext.getCurrentInstance();

        if(carrinho.isEmpty()){           
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Nenhum produto foi escolhido, adicione produtos para Concluir a compra"));           
            return;
        }
        
        valorTotal = 0;
        
        for(Venda v : carrinho){
            valorTotal+=v.getQuantidade()+v.getProduto().getValor();
            if(v.getProduto().getExigeReceita() && !receitaApresentada){
                rc.execute("insereReceita.show()");
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Produtos que necessitam de receita foram identificados."));
                return;
            }
        }    
        
        if(comprador!=null) {
            try {
                Long l = (VendaDAO.INSTANCE.quantidadeVendasCliente(comprador));
                desconto = l.intValue();
            } catch (Exception ex) {
                Logger.getLogger(VendaMBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        rc.execute("concluivenda.show()");
    }
    
    public void concluiVenda(ActionEvent event){
               
        for(Venda v : carrinho){
            if(v.getProduto().getExigeReceita()){
                v.setNomeMedico(nomeMedico);
                v.setCrm(crmMedico);
                v.setReceita(receitaMedica);
            }
            try {
                VendaDAO.INSTANCE.insereVenda(comprador, v.getProduto(), v.getQuantidade(), v.getNomeMedico(), v.getCrm(), v.getReceita(), desconto);
            } catch (Exception ex) {
                Logger.getLogger(VendaMBean.class.getName()).log(Level.SEVERE, null, ex);
                return;
            }
        }
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Venda Concluida com sucesso!"));
        
        initVars();
    }
    
    public void inserirReceita(ActionEvent event){
        if(crmMedico == null || nomeMedico == null){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Insira os dados para que a Receita Médica seja Validada"));
            return;
        }        
        receitaApresentada = true;
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Receita Anexada!"));

    }
    
    public Double valorAposDesconto(Double valorTotal, Integer desconto){
        if(valorTotal == null || desconto == null)
            return null;
        Double v = Double.valueOf(String.format("%.2f", valorTotal - (valorTotal*desconto/100)).replace(',', '.'));
        return v;
    }
    
    public void cancelarCliente(ActionEvent evt){
        comprador = new Cliente();
    }
    
    
    public Produto getProdutoEscolhido() {
        return produtoEscolhido;
    }

    public void setProdutoEscolhido(Produto produtoEscolhido) {
        this.produtoEscolhido = produtoEscolhido;
    }

    public Integer getQuantidadeEscolhido() {
        return quantidadeEscolhido;
    }

    public void setQuantidadeEscolhido(Integer quantidadeEscolhido) {
        this.quantidadeEscolhido = quantidadeEscolhido;
    }

    public ArrayList<Venda> getCarrinho() {
        return carrinho;
    }

    public void setCarrinho(ArrayList<Venda> carrinho) {
        this.carrinho = carrinho;
    }    

    public ArrayList<Produto> getListaProdutos() {
        return listaProdutos;
    }

    public void setListaProdutos(ArrayList<Produto> listaProdutos) {
        this.listaProdutos = listaProdutos;
    }

    public ArrayList<Produto> getProdutosFiltrados() {
        return produtosFiltrados;
    }

    public void setProdutosFiltrados(ArrayList<Produto> produtosFiltrados) {
        this.produtosFiltrados = produtosFiltrados;
    }

    public ArrayList<Produto> getProdutosEscolhidos() {
        return produtosEscolhidos;
    }

    public void setProdutosEscolhidos(ArrayList<Produto> produtosEscolhidos) {
        this.produtosEscolhidos = produtosEscolhidos;
    }

    public Venda getVendaEscolhidoRemover() {
        return vendaEscolhidoRemover;
    }

    public void setVendaEscolhidoRemover(Venda vendaEscolhidoRemover) {
        this.vendaEscolhidoRemover = vendaEscolhidoRemover;
    }

    public SelectItem[] getTipos() {
        return tipos;
    }

    public void setTipos(SelectItem[] tipos) {
        this.tipos = tipos;
    }

    public Cliente getComprador() {
        return comprador;
    }

    public void setComprador(Cliente comprador) {
        this.comprador = comprador;
    }

    public Long getCpfComprador() {
        return cpfComprador;
    }

    public void setCpfComprador(Long cpfComprador) {
        this.cpfComprador = cpfComprador;
    }

    public double getValorTotal() {
        return Double.parseDouble(String.format("%.2f", valorTotal).replace(',','.'));
    }

    public void setValorTotal(double valorTotal) {
        this.valorTotal = valorTotal;
    }


    public Integer getDesconto() {
        return desconto;
    }

    public void setDesconto(Integer desconto) {
        this.desconto = desconto;
    }

    public Boolean getReceita() {
        return receita;
    }

    public void setReceita(Boolean receita) {
        this.receita = receita;
    }

    public Boolean getReceitaApresentada() {
        return receitaApresentada;
    }

    public void setReceitaApresentada(Boolean receitaApresentada) {
        this.receitaApresentada = receitaApresentada;
    }

    public String getNomeMedico() {
        return nomeMedico;
    }

    public void setNomeMedico(String nomeMedico) {
        this.nomeMedico = nomeMedico;
    }

    public Integer getCrmMedico() {
        return crmMedico;
    }

    public void setCrmMedico(Integer crmMedico) {
        this.crmMedico = crmMedico;
    }   

    public String getReceitaMedica() {
        return receitaMedica;
    }

    public void setReceitaMedica(String receitaMedica) {
        this.receitaMedica = receitaMedica;
    }

    
}
